package com.quanyan.common.utils;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by Zheng.Ke
 * Date 2017/4/6.
 */
public class FtpUtils {

    /**
     * 获取文件名列表
     * @param hostName  FTP服务器地址
     * @param port      FTP服务器端口号
     * @param userName  FTP登录帐号
     * @param password  FTP登录密码
     * @param pathName  FTP服务器文件目录
     * @return
     */
    public static List<String> getFileNameList(String hostName, int port, String userName, String password, String pathName) {
        List<String> fileNameList = new ArrayList<>();
        FTPClient ftpClient = connectFtpServer(hostName, port, userName, password);
        try {
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathName);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for(FTPFile file : ftpFiles){
                fileNameList.add(file.getName());
            }

            ftpClient.logout();
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(ftpClient.isConnected()){
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return fileNameList;
    }

    /**
     * 登录ftp服务器
     * @param hostName  FTP服务器地址
     * @param port      FTP服务器端口号  默认是21
     * @param userName  FTP登录帐号
     * @param password  FTP登录密码
     * @return
     */
    private static FTPClient connectFtpServer(String hostName, int port, String userName, String password) {
        FTPClient ftpClient = new FTPClient();
        try {
            //连接FTP服务器
            ftpClient.connect(hostName, port);
            //登录FTP服务器
            ftpClient.login(userName, password);
            //验证FTP服务器是否登录成功
            int replyCode = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(replyCode)){
                new RuntimeException("连接ftp服务器失败");
            }
            ftpClient.setControlEncoding("utf-8");
        } catch (Exception e) {
            new RuntimeException("连接ftp服务器失败");
        }
        return ftpClient;

    }

    /**
     * 下载文件
     * @param hostName  FTP服务器地址
     * @param port      FTP服务器端口号
     * @param userName  FTP登录帐号
     * @param password  FTP登录密码
     * @param pathName  FTP服务器文件目录
     * @param fileName  文件名称
     * @param destFile  下载后的文件
     * @return
     */
    public static boolean downloadFile(String hostName, int port, String userName, String password, String pathName, String fileName, File destFile){
        boolean flag = false;
        FTPClient ftpClient = connectFtpServer(hostName, port, userName, password);
        try {
            //切换FTP目录
            ftpClient.changeWorkingDirectory(pathName);
            FTPFile[] ftpFiles = ftpClient.listFiles();
            for(FTPFile file : ftpFiles){
                if(fileName.equals(file.getName())){
                    OutputStream os = new FileOutputStream(destFile);
                    ftpClient.retrieveFile(new String(file.getName().getBytes("UTF-8"),"ISO-8859-1"), os);
                    os.flush();
                    os.close();
                    break;
                }
            }
            ftpClient.logout();
            flag = true;
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if(ftpClient.isConnected()){
                try {
                    ftpClient.logout();
                } catch (IOException e) {

                }
            }
        }
        return flag;
    }
}
